package cn.ryh.gatewaycode.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @author Rao
 * @Description 自定义全局GlobalFilter 需实现 GlobalFilter, Ordered接口
 * @create 2021-12-08 13:54
 */
@Component
public class GatewayLogFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        /*
          pre 请求转发之前执行逻辑
         */
        System.out.println("**************GatewayLogFilter pre:" + 0);
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        /*
          then方法为 post 请求转发之后执行逻辑
         */
        /*
          多个filter执行顺序为 先执行 getOrder 值越小的 pre 后执行值较大的pre，待转发的请求执行完成后
          先执行 getOrder 值越大的 post 后执行值较小的 post
         */
        return chain.filter(exchange).then(Mono.fromRunnable(()->{
            System.out.println("**************GatewayLogFilter post:" + 0);
        }));
    }

    /**
     * 表示其加载的顺序
     * 越小优先级越高。
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}
